#ifndef _GRID_
#define _GRID_

#include "Point.h"
#include "Dofs.h"
#include <vector>
using namespace std;
/**
 * @brief Grid:意指Mesh中每一个小网格，包含顶点信息和自由度信息。
 *
 * @tparam int DIM 维度
 */
template <unsigned int DIM>
class Grid
{
protected:
    int num_of_vertices;         /*< 顶点的数目*/
    vector<Point<DIM>> vertices; /*< 存储顶点的vector*/
public:
    /**
     * @brief 含参构造函数
     *
     * @param _pnts 包含顶点的vector,逆时针顺序
     */
    Grid(){};
    Grid(const vector<Point<DIM>> &_pnts) : vertices{_pnts}
    {
        num_of_vertices = _pnts.size();
    };
    /**
     * @brief 析构函数
     */
    ~Grid() = default;
    /**
     * @brief 设置grid的顶点，逆时针顺序
     *
     * @param _pnts 包含顶点的vector,逆时针顺序
     */
    void setVertices(const vector<Point<DIM>> &_pnts)
    {
        vertices.resize(_pnts.size());
        copy(_pnts.begin(), _pnts.end(), vertices.begin());
    };
    /**
     * @brief 返回包含顶点信息的vector
     * @return 顶点vector
     */
    vector<Point<DIM>> &getVertices()
    {
        return vertices;
    }
    /**
     * @brief 返回第_index个顶点，从1开始
     *
     * @param _index 顶点的下标
     * @return 第_index个顶点
     */
    const Point<DIM> &getVertices(int _index) const
    {
        return vertices[_index];
    };
    /**
     * @brief 返回顶点的个数
     * @return 顶点的个数
     */
    const int &getNumVertices() const
    {
        return num_of_vertices;
    };
};

#else
// Do Nothing
#endif
